package local_server

// 导入必要的包
import (
	"Lunar-Astral-API/local_server/config"   // 项目配置相关包
	"Lunar-Astral-API/local_server/handlers" // 处理API请求的包
	"Lunar-Astral-API/local_server/utils"    // 实用工具包
	"fmt"                                    // 用于格式化输入输出
	"log"                                    // 用于日志记录
	"net/http"                               // 用于构建HTTP服务器
	"time"                                   // 用于处理时间
)

// setupControlPanelServer 用于设置控制面板服务器，依次执行设置MIME类型、注册路由处理器和启动服务器的操作
func setupControlPanelServer() {
	// 设置控制面板的MIME类型
	setupMimeTypes()
	// 注册控制面板的路由处理器
	registerControlPanelHandlers()
	// 启动控制面板服务器
	startControlPanelServer()
}

// registerControlPanelHandlers 用于注册控制面板相关的HTTP请求处理函数
func registerControlPanelHandlers() {
	// 注册处理启动控制面板请求的处理器
	http.HandleFunc("/control_panel/start", handlers.ControlPanelStartHandler)
	// 注册处理停止控制面板请求的处理器
	http.HandleFunc("/control_panel/stop", handlers.ControlPanelStopHandler)
	// 注册处理编译并启动控制面板请求的处理器
	http.HandleFunc("/control_panel/compile", handlers.ControlPanelCompileHandler)
	// 注册静态文件服务，将根路径请求映射到 webpage 目录下的文件
	http.Handle("/", http.StripPrefix("/", http.FileServer(http.Dir("webpage"))))
}

// startControlPanelServer 用于启动控制面板的HTTP服务器
func startControlPanelServer() {
	// 构建服务器监听地址
	address := fmt.Sprintf(":%d", *config.ControlPanelPort)
	// 记录服务器启动信息
	log.Printf("-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-")
	log.Printf("控制面板服务 -> 启动在 http://localhost:%d/control.html", *config.ControlPanelPort)
	log.Printf("控制面板服务 -> 等待用户配置并启动主服务...")
	// 创建HTTP服务器实例，并添加CORS中间件
	server := &http.Server{
		Addr:    address,
		Handler: utils.CORSMiddleware(http.DefaultServeMux),
	}
	// 启动一个goroutine，延迟500毫秒后自动打开浏览器访问控制面板页面
	go func() {
		time.Sleep(500 * time.Millisecond)
		url := fmt.Sprintf("http://localhost:%d/control.html", *config.ControlPanelPort)
		utils.OpenBrowser(url)
	}()
	// 启动服务器监听请求，若出现错误且不是服务器正常关闭的错误，则记录错误并终止程序
	if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
		log.Fatalf("控制面板服务[ERROR] -> %v", err)
	}
}
